package cc.bookcloud.tool.ocr.common.parsetext;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import lombok.Data;

import java.lang.reflect.Field;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * @Desc: @todo
 * @Version: 2.0
 * @Author: John Goo
 * @Date: 2024/11/26 10:33
 **/
@Data
public abstract class OcrTextParseAbstract {

    // 临时变量使用
    protected List<OcrTextElementUnit> elementTemplateList = new ArrayList<>();

    // 元数据map
    protected Map<String,OcrTextElementUnit> metaMap = new LinkedHashMap<>();

    // 类型
    protected String type ="票据类型-未知";
    // 描述
    protected String typeDesc ="票据类型描述-未知";

    public abstract void type();



    public List<OcrTextElementUnit> elementList(){
        return elementTemplateList;
    }

    public OcrTextParseAbstract(){
        initElementTemplate();
        type();
    }
    /**
     * @Desc：初始化元素模板
     * @Author：John Goo
     * @Date：2024/11/26 10:35

     * @return void
     */
    public void initElementTemplate(){
        // 加载配置发票元素 @todo暂写代码中
        String[] array = this.eleTemplateArray();
        if(array !=null && array.length>0 ){
            for(int i=0;i<array.length;i++){
                String row = array[i];
                String[] values = row.split(",");
                if(values!=null && values.length > 3){
                    String attrName = values[0].trim();
                    String describe = values[1].trim();
                    String rule = values[1].trim();
                    String pos = values[1].trim();
                    elementTemplateList.add(new OcrTextElementUnit(attrName,describe,rule,pos));
                }
            }
        }
        // 转换成map对象
        elementTemplateList.forEach(item->{
            metaMap.put(item.getAttrName(),item);
        });
    }
    /**
     * 判断字符串是否全部由汉字组成
     *
     * @param str 要判断的字符串
     * @return 有汉字则返回true，无则返回false
     */
    public  boolean isIncludeChinese(String str) {
        if (str == null || str.length() == 0) {
            return false;
        }
        String regex = ".*[\\u4e00-\\u9fa5]+.*"; // 正则表达式匹配包含中文字符的字符串
        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(str);
        return matcher.matches();
    }

    public JSONArray transferJsonArray(){
        JSONArray array = new JSONArray();
        //把当前对象的数据状态转换成json数组形式
        Class<?> objClass = this.getClass();
        Field[] fields = objClass.getDeclaredFields();
        for (Field field : fields) {
            try {
                field.setAccessible(true); // 使私有属性可访问
                Object value = field.get(this);
                String key = field.getName();
                JSONObject row = new JSONObject();
                OcrTextElementUnit meta =metaMap.get(key);
                row.put("key",key);
                row.put("value",value);
                row.put("describe",meta.getDescribe());
                array.add(row);
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        }
        return array;
    }

    /**
     * @Desc：定义发票元素规则
     * @Author：John Goo
     * @Date：2024/12/3 17:13

     * @return String
    */
    public abstract String[] eleTemplateArray();
}
